---
title: 概述
---
## spring核心原理
任何实际的应用程序都是由很多组件组成的，每个组件负责整个应用功能的一部分，这些组件需要与其它应用元素协调以完成自己的任务。当应用程序运行时，需要以某种方式创建并引入这些组件。

Spring的核心是提供了一个容器（container）。通常被称为 Spring 应用上下文（Spring application context），它会创建和管理应用的组件(bean)。组件会在 Spring 应用上下文中装配在一起，从而形成了一个完整的应用程序。

将 bean 装配在一起的行为是通过一种基于依赖注入（Dependency Injection ,DI）的模式实现的。此时，组件不会再去创建它所依赖的组件并管理它们的生命周期，使用依赖注入的应用依赖于单独的实体（容器）来创建和维护所有的组件，并将其注入到需要它们的 bean 中。通常，这时通过构造器参数和属性方法（property accessor） 方法来实现的。



例如： 库存服务和商品服务。商品服务依赖于库存服务，这样它才能提供商品的完整信息。

![image-20230214002839108](https://img.wkq.pub/hexo/image-20230214002839108.png)

**应用组件通过 Spring 的应用上下文来进行管理并实现互相注入**



在核心容器之上，Spring及其一系列的相关库提供了 Web 框架、各种持久化可选方案、安全框架、与其它系统集成、运行时监控、微服务支持、反应式编程模型，以及众多现代应用开发所需的其它特性。


```xml title='一种过时的指导 Spring 应用上下文将 bean 装配在一起的方式是使用一个或多个 XML 文件，这些文件描述了各个组件以及它们与其它组件之间的关联关系。'
<bean id="inventoryService" class = "pub.wkq.InventoryService"/>
<bean id="productService" class="pub.wkq.ProductService">
    <constructor-arg ref="inventoryService"/>
</bean>
```
```java title='基于Java注解的配置'
@Configuration
public class ServiceConfiguration {
    @Bean
    public InvertoryService invertoryService() {
        return new InvertoryService();
    }
    @Bean
    public ProductService productService(){
        return new ProductService(invertoryService());
    }
}
```
`@Configuration`注解会告知 Spring 这是一个配置类，它会为 Spring 应用上下文提供 bean。

这个配置类的方法上使用 `@Bean` 注解进行了标注，表明这些方法所返回的对象会以 bean 的形式添加到 Spring 的应用上下文中（默认情况下，这些 bean 所对应的 bean ID 与定义它们的方法名称是相同的。）


但不管使用那种配置方式，都只有在 Spring 不能自动配置组件的时候才具有必要性。

在 Spring 中，自动配置起源于所谓的自动装配（autowiring）和组件扫描(component scanning)。
* 借助组件扫描技术，Spring 能够自动发现应用类路径下的组件，并将它们创建成 Spring 应用上下文中的 bean。
* 借助自动装配技术，Spring 能够自动为组件注入它们所依赖的其它 bean。

SpringBoot 是 Spring 框架的扩展，提供了很多生产效率方面的增强。最为熟知的就是自动配置（autoconfiguration）。Spring Boot 能够基于类路径中的条目，环境变量和其它因素合理猜测需要配置的组件,并将它们装配在一起。

:::tip
Spring Boot 的 autoconfiguration 大幅度减少了构建应用所需的显示配置的数量。
:::

## Spring Bean 的生命周期
Spring Bean 的生命周期比较复杂，可以分为创建和销毁两个过程。

首先，创建 Bean 会经过一系列的步骤，主要包括：

1. 实例化 Bean 对象。
2. 设置 Bean 属性。
3. 如果我们通过各种 Aware 接口声明了依赖关系，则会注入 Bean 对容器基础设施层面的依赖。具体包括 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware，分别会注入 Bean ID、Bean Factory 或者 ApplicationContext。
4. 调用 BeanPostProcessor 的前置初始化方法 postProcessBeforeInitialization。
5. 如果实现了 InitializingBean 接口，则会调用 afterPropertiesSet 方法。
6. 调用 Bean 自身的 init 方法。
7. 调用 BeanPostProcessor 的后置处理方法 postProcessAfterInitialization。
8. 创建过程完毕。

![](https://img.wkq.pub/spring/3a51f06f56b905b8fbf1661359e1727e.webp)

第二，Spring Bean 的销毁过程会依次调用 DisposableBean  的 destroy 方法和 Bean 自身定制的 destroy 方法。

Spring Bean 有五个作用域，其中最基础的有下面两种：

* Singleton,这是 Spring的默认作用域，也就是为每个 IOC 容器创建唯一的一个 Bean 实例。
* Prototype,针对每个 getBean 请求，容器都会单独创建一个 Bean 实例。

从 Bean 的特点来看，Prototype 适合有状态的 Bean，而 Singleton 则更适合无状态的情况。另外，使用 Prototype 作用域需要经过仔细考虑，毕竟频繁创建和销毁 Bean 是有明显开销的。

如果是 Web 容器，则支持两外三种作用域：

* Request，为每个 HTTP 请求创建单独的 Bean 实例。
* Session，作用域是 Session 范围
* GlobalSession ，提供一个全局性的 HTTP Session



## Spring 重点项目

### Spring 核心框架
Spring 核心框架是 Spring 领域中一切的基础，提供了核心容器和依赖注入框架。


另外，它还提供了一些其它重要的特性。比如：

* Spring MVC ，也就是 Spring 的 Web 框架。
* 对数据持久化的基础支持，如 JdbcTemplate。
* 反应式风格编程的支持，如果 Spring WebFlux

### Spring Boot

Spring Boot 是 Spring 的 扩展，通过简化依赖管理、自动配置和运行时监控，使 Spring 更加易于使用。

### Spring Data
尽管 Spring 核心框架提供了基本的数据持久化支持，但 Spring Data 提供了很多的功能：将应用程序的数据存储库（repository）定义为简单的 Java 接口，在定义存储和检索数据的方法时使用一种特定的命名约定即可。

此外，Spring Data 能够处理多种不同类型的数据库，包括关系型数据库（通过 JDBC 和 JPA 实现）、文档数据库（MongoDB）、图数据库（Neo4j）等。
### Spring Security
Spring Security 解决了应用程序通用的安全需求，包括身份验证、授权和API安全性。
### Spring Integration 和 Spring Batch
大多数应用程序都需要与其它应用的其它组件集成。在这方面，有一些应用程序集成的模式来解决这些需求。Spring Integration 和 Spring Batch 为 基于 Spring 的应用程序提供了这些模式的实现。
Spring Integration 解决了实时集成问题，Spring Batch 解决的则是批处理集成的问题。
### Spring Cloud
Spring Cloud 是使用 Spring 开发微服务的一组项目。



